#include <stdio.h>
#include <math.h>
#include <limits.h>

////浮点数在内存中的存储
//int main() {
////    判断浮点数大小用相减fabs,判断误差
////浮点数在内存中存储跟整型不同,遵循754标准,(-1)^s*m*2^e,最高位为s,之后八位为e(+127修正后),剩下的存m(默认去掉1,只存二进制小数位)
//    float  a = 0.1;
//    float  b = 0.2;
//    float  c = 0.3;
//    if(fabs(a + b - 0.3) <0.000001){
//        printf("=");
//    } else{
//        printf("!=");
//    }
//    return 0;
//}

////结构体
//struct Stu{
//    char name[20];
//    int age;
//    char id[12];
//    double weight;
//}s4,s5,s6;  //s4,s5,s6;是全局的结构体变量
//
//int main(){
//    struct Stu s1 = {.age = 1,.name = "zhangsan",.id = "13425",.weight = 12.2};
//    struct Stu s2 = {"hs",12,"14141",12.2};
//
//    return 0;
//}

////匿名结构体       匿名结构体只能用一次
//struct {
//    char s;
//    int a;
//
//}s1;
//
//int main(){
//    s1.a = 'a';
//    s1.s = 12;
//
//    return 0;
//}


//结构体自引用,链表结构
//struct s{
//    int a;
//    struct s* next;  //同类型
//
//};

//typedef struct s{
//    int a;
//    struct s* next;  //使用typedef重命名时,结构体自引用,必须用完整名字定义
//
//}s;

//int main(){
//    s s1={.a = 10};
//
//    return 0;
//}

//结构体内存对齐
//对齐数与类型占字节(小的)对该类型的对齐数,结构体第一个成员从内存地址0处开始对齐,后面成员类型按照对齐数的整数倍进行对齐.最后结构体大小(sizeof)为最大对齐数的整数倍
#pragma pack(4)/*编译选项，表示4字节对齐 平台：VS2013。语言：C语言*/
////假设long 是4个字节
//int main(int argc, char* argv[])
//{
//    struct tagTest1
//    {
//        short a;
//        char d;
//        long b;
//        long c;
//    };
//    struct tagTest2
//    {
//        long b;
//        short c;
//        char d;
//        long a;
//    };
//    struct tagTest3
//    {
//        short c;
//        long b;
//        char d;
//        long a;
//    };
//    struct tagTest1 stT1;
//    struct tagTest2 stT2;
//    struct tagTest3 stT3;
//
//    printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
//    return 0;
//}
//#pragma pack()

//模拟实现atoi(将字符转换为整型)

int my_atoi (const char * str){
    if(str == NULL) return 0;
    int i = 0;
    int sign = 1;
    int sum = 0;
    while (str[i] == ' '){
        i++;
    }
    if(str[i] =='+'||str[i] == '-'){
        sign = (str[i] == '-')?-1 : 1;
        i++;
    }
    while (str[i] != '\0'){
        if(str[i] >= '0' && str[i]  <= '9'){
            if(sign == 1 && sum > INT_MAX / 10 ||(sum == INT_MAX / 10 && str[i] -'0' > INT_MAX % 10) ){
                return INT_MAX;
            }
            else if(sign == -1 && (sum > INT_MAX / 10  || (sum == INT_MAX / 10  && str[i] - '0' > (INT_MAX % 10 +1)))){
                return INT_MIN;
            }
            sum = sum*10 + (str[i] - '0');
        }
        else{
            break;
        }
        i++;
    }
    return sum*sign;
}
int main(){
    char x[19] = "7689";
    int ret = my_atoi(x);
    printf("%d",ret);

    return 0;
}